"""
@File    ：run.py
@Author  ：ixiaodu
@Date    ：2025/10/24
@Desc    ：
"""
import time
import requests
from setuptools import config
from test_cases.conftest import test_results
from utils import config
from utils.logger import log


class WeChatSend:
    """
    企业微信消息通知
    """

    def __init__(self, ):
        self.headers = {"Content-Type": "application/json"}

    def send_text(self, content, mentioned_mobile_list=None):
        """
        发送文本类型通知
        :param content: 文本内容，最长不超过2048个字节，必须是utf8编码
        :param mentioned_mobile_list: 手机号列表，提醒手机号对应的群成员(@某个成员)，@all表示提醒所有人
        :return:
        """
        _data = {"msgtype": "text", "text": {"content": content, "mentioned_list": None,
                                             "mentioned_mobile_list": mentioned_mobile_list}}

        if mentioned_mobile_list is None or isinstance(mentioned_mobile_list, list):
            # 判断手机号码列表中得数据类型，如果为int类型，发送得消息会乱码
            if len(mentioned_mobile_list) >= 1:
                for i in mentioned_mobile_list:
                    if isinstance(i, str):
                        res = requests.post(url=config["wechat"]["webhook"], json=_data, headers=self.headers)
                        if res.json()['errcode'] != 0:
                            log.error(res.json())
                            log.error("企业微信「文本类型」消息发送失败")

                    else:
                        log.error("手机号码必须是字符串类型.")
        else:
            log.error("手机号码列表必须是list类型.")

    def send_markdown(self, content):
        """
        发送 MarkDown 类型消息
        :param content: 消息内容，markdown形式
        :return:
        """
        _data = {"msgtype": "markdown", "markdown": {"content": content}}
        res = requests.post(url=config["wechat"]["webhook"], json=_data, headers=self.headers)
        if res.json()['errcode'] != 0:
            log.error(res.json())
            log.error("企业微信「MarkDown类型」消息发送失败")

    def _upload_file(self, file):
        """
        先将文件上传到临时媒体库
        """
        key = config["wechat"]["webhook"].split("key=")[1]
        url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key={key}&type=file"
        data = {"file": open(file, "rb")}
        res = requests.post(url, files=data).json()
        return res['media_id']

    def send_file_msg(self, file):
        """
        发送文件类型的消息
        @return:
        """

        _data = {"msgtype": "file", "file": {"media_id": self._upload_file(file)}}
        res = requests.post(url=config["wechat"]["webhook"], json=_data, headers=self.headers)
        if res.json()['errcode'] != 0:
            log.error(res.json())
            log.error("企业微信「file类型」消息发送失败")

    def send_wechat_notification(self):
        """ 发送企业微信通知 """
        text = f"""【UI自动化测试通知】
                >测试环境：<font color=\"info\">TEST-{config["env"]}</font>
                >测试负责人：@
                >
                > **执行结果**
                ><font color = green>成  功  率  : {test_results.get('pass_rate', 0)}%</font>
                >用例总数量：<font color=\"info\">{test_results.get('run_case', 0)}</font>                                    
                >通过用例数：<font color=\"info\">{test_results.get('pass_case', 0)}</font>
                >失败用例数：{test_results.get('fail_case', 0)}条
                >异常用例数：{test_results.get('error_case', 0)}个
                >跳过用例数：<font color=\"warning\">{test_results.get('skip_case', 0)}个</font>
                >用例执行时长：<font color=\"comment\">{round(test_results.get('times', 0), 2)} s</font>
                >时间：<font color=\"comment\">{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}</font>
                >
                >非相关负责人员可忽略此消息。
                >测试报告，点击查看>>[测试报告入口]({config['allure_url']})"""

        WeChatSend().send_markdown(text)


if __name__ == '__main__':
    WeChatSend().send_wechat_notification()
